package modelo

import org.junit.Before
import org.junit.Test
import org.junit.Assert
import exepciones.NoMoreZombiesException
import exepciones.SeMurioLaPlantaException
import exepciones.perdisteException
import static org.mockito.Matchers.*
import static org.mockito.Mockito.*
import org.uqbar.commons.model.UserException

class TestDeAtaque {
	Planta tomateHomicida
	Planta pepinoEndeble
	Zombie zombie
	Jugador player1
	Sistema sistema
	Jardin jardin
	Observer obs
	Planta pared
	Planta tomateHomicida2
	TipoTerrestre tipoT
	
	@Before
	def void init(){
	sistema= new Sistema(new Jugador)
	jardin= new Jardin
	tipoT= new TipoTerrestre
	pared= sistema.crearPlanta(10,600,"pared",tipoT)
	tomateHomicida= sistema.crearPlanta(100,300,"tomateHomicida",tipoT)
	tomateHomicida2= sistema.crearPlanta(100,300,"tomateHomicida2",tipoT)
	pepinoEndeble= sistema.crearPlanta(10,5,"pepinoEndeble",tipoT)
	player1= new Jugador
	zombie= sistema.crearZombie(10,70, "zombie residen evil 2")
	obs= new Observer
	player1.sistemaBase= sistema
	
	player1.filaSeleccionada=jardin.filas.get(1)
	player1.jardin=jardin
	player1.zombieSeleccionado=zombie	
	}
	
	//testeo victoria de las plantas
	@Test
	def void plantasVictory(){
		player1.monedero=0
		jardin.agregaPlanta(1, tomateHomicida)
		player1. primerAtaque()
		Assert::assertTrue(player1.obs.noHayMasZombies)
	}
	//testeo de derrota de plantas
	@Test(expected=typeof(UserException))
	def void plantasDefeated(){
		jardin.agregaPlanta(1, pepinoEndeble)
		player1. primerAtaque()
		}
		
	@Test
	def void muerteDePlantas(){
		jardin.agregaPlanta(1, pared)
		jardin.agregaPlanta(1, pepinoEndeble)
		Assert::assertTrue(jardin.filas.get(1).fila.size==2)
		player1. primerAtaque()
		Assert::assertTrue(jardin.filas.get(1).fila.size==1)
		
		}
		
		
		

	//en los dos siguientes casos tuve que ser particularmente puntilloso, el metodo random hace dificil el testeo
		
	//testeo de loot de plantas
	@Test
	def void dropeoDePlantas(){
		var x=player1.jardinZenTierra.size
		zombie.daPlanta(player1.obs)
		Assert::assertTrue(player1.jardinZenTierra.size>x)
	}
	
		//testeo de loot de oro
	@Test
	def void dropeoDeOro(){
		
		var x=player1.monedero
		zombie.daPremio(player1.obs)
		Assert::assertTrue(player1.monedero>x)
		}

		/*testeo de clonacion
		  si se le pega a una planta clonada, no deberia cambiar la vida del prototipo
		*/
	@Test
	def void testClonacion(){
		var resistenciaOriginalPrototipo = tomateHomicida.getResistencia()
		jardin.agregaPlanta(1, tomateHomicida)
		player1. primerAtaque()
		player1. primerAtaque()
		player1. primerAtaque()
		Assert::assertEquals(resistenciaOriginalPrototipo,tomateHomicida.getResistencia())
		
	}
	
}